package cn.zxcoder.controller.pay;

import cn.zxcoder.Tools.ToolUtil;
import cn.zxcoder.entity.Res;
import cn.zxcoder.entity.SystemManage.Dept;
import cn.zxcoder.entity.pay.CnfInfo;
import cn.zxcoder.entity.pay.Mode;
import cn.zxcoder.service.ICnfInfoService;
import cn.zxcoder.service.IModeService;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import jdk.nashorn.internal.objects.annotations.Setter;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.stereotype.Controller;

import java.lang.reflect.InvocationTargetException;
import java.util.*;
import java.util.stream.Collectors;

import static java.util.stream.Collectors.toMap;

/**
 * <p>
 *  前端控制器
 * </p>
 *
 * @author zx
 * @since 2023-05-08
 */
@RestController
@RequestMapping("/api/MachineConfig")
@Api(tags = "配置信息功能实现")
public class CnfInfoController {

    @Autowired
    ICnfInfoService iCnfInfoServiceIml;
    @Autowired
    IModeService iModeServiceIml;



    @ApiOperation("获取支付配置信息")//需要改有连表查询
    @PostMapping("/list")
    public Res getCnfInfo(@RequestParam String page,@RequestParam String limit,@RequestParam String tnumber) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
        if (!tnumber.equals("")) {//搜索某终端号的信息
            QueryWrapper<CnfInfo> wrapper = new QueryWrapper<>();
            wrapper.like("tnumber", tnumber);
            wrapper.select(CnfInfo.class, info -> !info.getColumn().equals("name") && !info.getColumn().equals("subName"));
            IPage<CnfInfo> cnfInfoPage = new Page<>(Integer.parseInt(page), Integer.parseInt(limit));
            IPage<CnfInfo> page1 = iCnfInfoServiceIml.page(cnfInfoPage, wrapper);

            if (page1.getRecords().size() > 0) {//有数据再进行下一步
                ToolUtil.setFieldCnfInfo(page1,iModeServiceIml);
                return new Res(true, JSON.toJSONString(page1), "获取支付配置信息成功");
            } else {
                return new Res(true, null, "暂时还没有支付配置信息哦");
            }

        } else {//直接获取所有的
            IPage<CnfInfo> cnfInfoPage = new Page<>(Integer.parseInt(page), Integer.parseInt(limit));
            //因为继承的原因，所以不能去查父类的字段。用wrapper去排出掉
            QueryWrapper<CnfInfo> wrapper = new QueryWrapper<>();
            wrapper.select(CnfInfo.class, info -> !info.getColumn().equals("name") && !info.getColumn().equals("subName"));
            IPage<CnfInfo> page1 = iCnfInfoServiceIml.page(cnfInfoPage,wrapper);

            if (page1.getRecords().size() > 0) {//有数据再进行下一步
//                ToolUtil.setFiled(page1,CnfInfo.class,"mode",iModeServiceIml.getClass(),"list",Mode.class,"name");
                ToolUtil.setFieldCnfInfo(page1,iModeServiceIml);
                return new Res(true, JSON.toJSONString(page1), "获取支付配置信息成功");
            } else {
                return new Res(true, null, "暂时还没有支付配置信息哦");
            }

        }

    }

    @ApiOperation("保存支付配置信息")
    @PostMapping("/save")
    public Res saveCnfInfo(@RequestParam boolean issave,@RequestParam String id,@RequestParam String tnumber,
                           @RequestParam String mode,@RequestParam String configId,
                           @RequestParam String status,@RequestParam String token) {

        if (issave) {//保存支付配置信息
            CnfInfo cnfInfo = new CnfInfo();
            cnfInfo.setMode(Integer.parseInt(mode));
            cnfInfo.setStatus(status);
            cnfInfo.setEditTime(new Date());
            cnfInfo.setEditUser(token);
            cnfInfo.setTnumber(tnumber);
            cnfInfo.setConfigId(Integer.parseInt(configId));

            boolean save = iCnfInfoServiceIml.save(cnfInfo);
            return new Res(save, null, save ? "保存配置信息成功" : "保存配置信息失败");
        } else {//编辑支付配置信息
            UpdateWrapper<CnfInfo> wrapper = new UpdateWrapper<>();
            wrapper.eq("id", id);
            wrapper.set("mode", mode);
            wrapper.set("status", status);
            wrapper.set("editTime", new Date());
            wrapper.set("editUser", token);
            wrapper.set("tnumber", tnumber);
            wrapper.set("configId", configId);

            boolean update = iCnfInfoServiceIml.update(wrapper);
            return new Res(update, null, update ? "保存配置信息成功" : "保存配置信息失败");
        }
    }


    @ApiOperation("删除支付配置信息")
    @DeleteMapping("/delete/{id}")
    public Res deleteCnfInfo(@PathVariable String id) {
        boolean b = iCnfInfoServiceIml.removeById(Integer.parseInt(id));
        return new Res(b, null, b ? "删除配置信息成功" : "删除配置信息失败");
    }

    @ApiOperation("获取支付方式信息")
    @GetMapping("/mode")
    public Res getMode() {
        List<Mode> list = iModeServiceIml.list();
        return new Res(true, JSON.toJSONString(list),  "获取支付方式信息成功" );
    }

}
